package rtool

import (
	"cmp"
	"net/http"
	"strings"
	"unicode"
)

// ToTitle 将字符串的首字母转换为大写
func ToTitle(str string) string {
	if len(str) <= 0 {
		return str
	}
	var _tempStr = []rune(strings.ToLower(str))
	if unicode.IsLetter(_tempStr[0]) {
		_tempStr[0] = unicode.ToUpper(_tempStr[0])
	}
	return string(_tempStr)
}

// ToHttpHeaderKey 将字符串转换为HTTP头字段的格式
func ToHttpHeaderKey(key string) string {
	return http.CanonicalHeaderKey(key)
}

// ToUATitle 每个单词的首字母转换为大写
func ToUATitle(str string) string {
	if len(str) <= 0 {
		return str
	}
	var _tempStr = []rune(strings.ToLower(str))
	var first = true
	for i, d := range _tempStr {
		if unicode.IsLetter(d) {
			if first {
				_tempStr[i] = unicode.ToUpper(_tempStr[i])
				first = false
				continue
			}
			continue
		}
		if unicode.IsNumber(d) {
			if first {
				first = false
				continue
			}
			continue
		}
		first = true
	}
	return string(_tempStr)
}

// JoinString 拆分再合并字符串
// src：需要拆分的字符串模板，比如：4e6f9e19f397e8b3e42716aaf8f80589f1ed42c1272f7e7b25e5c5de7d88b2d1
// substr：需要往中间添加的子字符串，比如：-
// length：第 1 段的长度
// lengths：后续 n 段各自的长度
// 案例 JoinString(s, "-", 1, 2, 3, 4) 返回：4-e6-f9e-19f3
func JoinString(src string, substr string, length int, lengths ...int) string {
	lengths = append([]int{length}, lengths...)
	var rt strings.Builder
	for i, d := range lengths {
		if len(src) <= d {
			rt.WriteString(src)
			break
		}
		rt.WriteString(src[:d])
		if i != len(lengths)-1 {
			rt.WriteString(substr)
		}
		src = src[d:]
	}
	return rt.String()
}

// Join 拆分再合并
// src：需要拆分的模板，比如：[]rune("4e6f9e19f397e8b3e42716aaf8f80589f1ed42c1272f7e7b25e5c5de7d88b2d1")
// substr：需要往中间添加的子模板，比如：[]rune("-")
// length：第 1 段的长度
// lengths：后续 n 段各自的长度
// 案例 Join([]rune(s), []rune("-"), 1, 2, 3, 4) 返回：[]rune("4-e6-f9e-19f3")
func Join[T cmp.Ordered](src []T, substr []T, length int, lengths ...int) []T {
	lengths = append([]int{length}, lengths...)
	var rt []T
	for i, d := range lengths {
		if len(src) <= d {
			rt = append(rt, src...)
			break
		}
		rt = append(rt, src[:d]...)
		if i != len(lengths)-1 {
			rt = append(rt, substr...)
		}
		src = src[d:]
	}
	return rt
}
